package com.xunyin.modules.couponnew.service;


import com.xunyin.common.service.BaseService;
import com.xunyin.modules.couponnew.domain.MtCoupon;
import com.xunyin.modules.couponnew.domain.MtUserCoupon;
import com.xunyin.modules.couponnew.service.dto.MtCouponQueryCriteria;
import com.xunyin.modules.couponnew.service.dto.ReqCouponDto;
import com.xunyin.pagination.PaginationRequest;
import com.xunyin.pagination.PaginationResponse;
import com.xunyin.web.ResponseObject;
import org.springframework.data.domain.Pageable;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.List;
import java.util.Map;

/**
 * 卡券业务接口
 * <p>
 * Created by xunyinyunshang <3594419785@qq.com>
 * CopyRight 讯音云商 https://www.tonetn.com
 */
public interface CouponService extends BaseService<MtCoupon> {

    /**
     * 分页查询卡券列表
     *
     * @param paginationRequest
     * @return
     */
    PaginationResponse<MtCoupon> queryCouponListByPagination(PaginationRequest paginationRequest);

    /**
     * 查询数据分页
     *
     * @param criteria 条件
     * @param pageable 分页参数
     * @return Map<String, Object>
     */
    Map<String, Object> queryAll(MtCouponQueryCriteria criteria, Pageable pageable);

    /**
     * 查询所有数据不分页
     *
     * @param criteria 条件参数
     * @return List<MtCouponGroup>
     */
    List<MtCoupon> queryAll(MtCouponQueryCriteria criteria);

    /**
     * 分页查询卡券列表
     *
     * @param paginationRequest
     * @return
     */
    /*PaginationResponse<MtCoupon> queryCouponListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;*/

    /**
     * 保存卡券
     *
     * @param reqCouponDto
     */
    MtCoupon saveCoupon(ReqCouponDto reqCouponDto) throws ParseException;

    /**
     * 根据ID获取卡券信息
     *
     * @param id 卡券ID
     */
    MtCoupon queryCouponById(Integer id);

    /**
     * 删除卡券信息
     *
     * @param id       卡券ID
     * @param operator 操作人
     */
    void deleteCoupon(Long id, String operator);

    /**
     * 获取卡券列表
     *
     * @param paramMap 查询参数
     */
    ResponseObject findCouponList(Map<String, Object> paramMap);

    /**
     * 发放卡券
     *
     * @param couponId 券ID
     * @param mobile   操作人
     * @param num      发放套数
     */
    //void sendCoupon(Integer couponId, String mobile, Integer num, String uuid, String operator);
    void sendCoupon(Integer couponId, Integer num, Integer userId, Integer storeId);

    void sendCouponRefGive(Integer couponId, Integer num, Integer userId, Integer storeId,String refGive);

    /**
     * 根据分组获取卡券列表
     *
     * @param groupId 查询参数
     */
    List<MtCoupon> queryCouponListByGroupId(Integer groupId);

    /**
     * 核销卡券
     *
     * @param userCouponId 用户券ID
     * @param userId       核销会员ID
     * @param storeId      店铺ID
     * @param orderId      订单ID
     * @param amount       核销金额
     * @param remark       核销备注
     */
    String useCoupon(Integer userCouponId, Integer userId, Integer storeId, Integer orderId, BigDecimal amount, String remark);

    /**
     * 根据券ID删除个人卡券
     *
     * @param id       券ID
     * @param operator 操作人
     */
    void deleteUserCoupon(Integer id, String operator);

    /**
     * 根据券ID 撤销个人卡券消费流水
     *
     * @param id           消费流水ID
     * @param userCouponId 用户卡券ID
     * @param operator     操作人
     */
    void rollbackUserCoupon(Integer id, Integer userCouponId, String operator);

    /**
     * 根据ID获取用户卡券信息
     *
     * @param userCouponId 查询参数
     */
    MtUserCoupon queryUserCouponById(Integer userCouponId);

    /**
     * 根据批次撤销卡券
     *
     * @param id       ID
     * @param uuid     批次ID
     * @param operator 操作人
     */
    void removeUserCoupon(Long id, String uuid, String operator);

    /**
     * 判断卡券码是否过期
     *
     * @param code 券码
     */
    boolean codeExpired(String code);

    /**
     * 判断卡券是否有效
     *
     * @param coupon
     * @return
     */
    boolean isCouponEffective(MtCoupon coupon);

    void updateIsNewGiveStatus(Integer id, String isNewGiveStatus);

    void updateRefGiveStatus(Integer id, String refGiveStatus);

    List<MtCoupon> queryCouponListByCondi(MtCoupon coupon);
}
